#include "Logger.h"
#include "Estadistico.h"

#include <iostream>
#include <getopt.h>
#include <sys/wait.h>

#define MAXJUG 8

using namespace std;

int correrSimulacion(int cantJugadores, int debug) {
	
	char* jugadores[] = {(char*)"2",(char*)"3",(char*)"4",(char*)"5",(char*)"6",(char*)"7",(char*) "8"};
	
	char *activarDebug = (char*) "NO debug";
	if (debug) {
		activarDebug = (char*) "debug";
		Logger::activarDebug();
	}
	
	int pid = fork();
	if(pid == 0) {
		execlp((char*) "./procJugadorCoordinador", (char*) "procJugadorCoordinador", jugadores[cantJugadores - 2], activarDebug, (char*) NULL);
	}
	
	
	for (int i = 0; i <= cantJugadores - 2; i++) {
		pid = fork();
		if(pid == 0){
			execlp((char*) "./procJugador", (char*) "procJugador", jugadores[i], jugadores[cantJugadores - 2], activarDebug, (char*) NULL);
		}
	}

	cout << "Pid del juego: " << getpid() << "." << endl;
	
	Estadistico est(cantJugadores);
	est.correr();	
	
	for (int i = 0; i < cantJugadores; i++)
		wait(NULL);
	
	return 0;
}


void imprimeUso() {
	cout << "   -= ConcuPig - Simulador de ChanchoVa =-" << endl;
	cout << "\n\t-h, --help" << endl;
	cout << "\tImprime mensaje de uso" << endl;
	cout << "\n\t-n NUM, --jugadores=NUM" << endl;
	cout << "\t\tSimula una partida con NUM jugadores" << endl;
	cout << "\n\t-d, --debug" << endl;
	cout << "\t\tGenera un archivo de Log ('log.txt') con las actividades del programa" << endl; 
}


bool cantidadJugadoresValido(int cant) {
	if(cant > 1 && cant <= MAXJUG)
		return true;
	return false;
}


int main(int argc, char **argv) {
	
	const char* const op_cortas = "hdn:" ;

	/* Una estructura de varios arrays describiendo los valores largos */
	const struct option op_largas[] =
	{ 
	  { "help",      0,  NULL, 'h'},
	  { "jugadores", 1,  NULL, 'n'},
	  { "debug",     0,  NULL, 'd'},
	  { NULL,        0,  NULL,  0}
	};
	
	if (argc == 1) {
		imprimeUso();
		return 0;
	}
	
	int sigOpc = 1, jugadores = 0, debug = 0;
	
	while (sigOpc) {
		sigOpc = getopt_long (argc, argv, op_cortas, op_largas, NULL);
		
		if (sigOpc == -1) break;
		
		switch (sigOpc) {
			case 'h' : 				/* -h o --help */
				imprimeUso();
				return 0;

			case 'n' : 				/* -n o --jugadores */
				jugadores = atoi(optarg);
				break;

			case 'd' : 				/* -d ó --debug */
				debug = 1; 
				break;

			case '?' : 				/* opción no valida */
			imprimeUso(); 
			return 1;
		}
	}
	if ( ! cantidadJugadoresValido(jugadores)) {
		cout << "Cantidad de jugadores debe ser mayor que 1 y menor que "<< MAXJUG << endl;
		return 0;
	}
	
	correrSimulacion(jugadores, debug);
	
	return 0;
}
